package com.example.home

/**
 * @Description
 * @department 城市元宇宙组
 * @Author niushilong
 * @Date 2024-04-06 16:01
 */
fun main(){
    println("hello world")

    /**
     * KProperty 有三种
     * 1：KProperty0 --> 描述顶层属性，直接调用call可获取该属性值
     * 2：KProperty1 --> 描述一个具体的类的属性，调用call的时候需要传入该对象
     * 3：KPropertu2 --> 2个接收者的属性，这种比较少见，只有定义在类中的扩展属性才可以，当然要获取这种属性的值或者给它赋值需要传入2个接收者。
     */
    //  KProperty0<Int>
    val topLevelValueProperty = ::topLevelValue
    val topValue = topLevelValueProperty.call()    // 顶层属性直接获取值不需要传参
    println(topValue)
    topLevelValueProperty.set(50)      // 修改值：5 ——》50
    println(topValue)

    //  KProperty1<ChildClass, Int>
    val valueOfChildClassProperty = ChildClass::value1
    val child = ChildClass()
    val call = valueOfChildClassProperty.call(child)
    println(call)
    valueOfChildClassProperty.set(child, 100)   // 修改值：10 --> 100


    //  KFunction0<Unit>
    val topLevelFunc = ::topLevelFuncWithNoParam
    topLevelFunc.call()

    // KFunction1<Int, Unit>
    val topLevelWithOneFunc = ::topLevelFuncWithOneParam
    topLevelWithOneFunc.call(123)

    // KFunction1<ChildClass, Unit>
    val testMethodFunction = ChildClass::test
    testMethodFunction.call(child)

    // KFunction2<ChildClass, Int, Unit>
    val testMethodWithOneParamFunction = ChildClass::testWithParamOne
    testMethodWithOneParamFunction.call(child, 333)

    //  KFunction3<ChildClass, Int, String, Unit>
    val testMethodWithTwoParamsFunction = ChildClass::testWithParamTwo
    testMethodWithTwoParamsFunction.call(child, 666, "老铁！")







}

// 顶层函数
fun topLevelFuncWithNoParam(){
    println("topLevelFunc() 无参顶层函数")
}

fun topLevelFuncWithOneParam(a: Int){
    println("topLevelFunc() 一个参数顶层函数")
}

// 顶层属性
var topLevelValue = 5

class ChildClass{
    var value1 = 10

    fun test(){
        println("test()：no param")
    }

    fun testWithParamOne(a: Int){
        println("testWithParamOne()：$a")
    }

    fun testWithParamTwo(a: Int, b: String){
        println("testWithParamTwo()：a->$a  b->$b")
    }
}